package com.rengwuxian.coursecoroutines._4_flow

import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.drop
import kotlinx.coroutines.flow.dropWhile
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.take
import kotlinx.coroutines.flow.takeWhile
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlin.coroutines.EmptyCoroutineContext

/**
 * drop() / dropWhile() / take() / takeWhile()
 * drop() / dropWhile() / take() / takeWhile()
 *
 * 过滤性操作符，属于截断性过滤，持续丢数据，直到某条数据开始才往下转发/或者相反，持续发数据，直到某一条数据开始，就停止。
 * 1.flow1.drop(2) ：丢弃前两条数据
 * 2.flow1.dropWhile { it!= 3 } ：凡是符号括号里面条件的都丢弃，直到遇到第一个不符合的，就不再检查，后面会一直发。
 * 3.flow1.take(2) ：只取前两条数据，后面数据都不要了。
 * 4.flow1.takeWhile { it!= 3 } ：凡是符号括号里面条件的都取，直到遇到第一个不符合的，就不再检查，后面会一直丢弃。
 * 本例子输出如下：
 * 1: 3
 * 1: 4
 * 1: 5
 * 2: 3
 * 2: 4
 * 2: 5
 * 3: 1
 * 3: 2
 * 4: 1
 * 4: 2
 */
fun main() = runBlocking<Unit> {
  val scope = CoroutineScope(EmptyCoroutineContext)
  val flow1 = flowOf(1, 2, 3, 4, 5)
  scope.launch {
    flow1.drop(2).collect { println("1: $it") }
    flow1.dropWhile { it != 3 }.collect { println("2: $it") }
    flow1.take(2).collect { println("3: $it") }
    flow1.takeWhile { it != 3 }.collect { println("4: $it") }
  }
  delay(10000)
}